#ifndef __DOUBLELINKLIST_H_
#define __DOUBLELINKLIST_H_
 
template<typename T>
struct Node
{
	Node(const T& value):_value(value),_pPre(nullptr),_pNext(nullptr){}
	T _value;
	Node<T>* _pPre;
	Node<T>* _pNext;
};
 
template<typename T>
class DoubleLinkList
{
private:
	size_t _size;
	Node<T>* _pHead;
	Node<T>* _pTail;
private:
	// 清除所有元素
	void _Destroy()
	{
		if (_pHead != nullptr)
		{
			Node<T>* pCur = _pHead;
			while (pCur->_pNext)
			{
				pCur = pCur->_pNext;
				delete pCur->_pPre;
			}
			delete pCur;
			_pHead = _pTail = nullptr;
			_size = 0;
		}
		
	}
	// 返回一个新节点
	Node<T>* _BuyNode(const T&value)
	{
		return new Node<T>(value);
	}
public:
	// 构造函数
	DoubleLinkList():_size(0),_pHead(nullptr),_pTail(nullptr){}
	// 拷贝构造函数
	DoubleLinkList(const DoubleLinkList<T>& list);
	// 构造函数重载
	DoubleLinkList(size_t n, const T& value = T());
	// 赋值操作符重载
	DoubleLinkList<T>& operator =(const DoubleLinkList<T>& list);
	// 析构函数
	~DoubleLinkList();
	// 尾插
	void PushBack(const T& value);
	// 尾删
	void PopBack();
	// 头插
	void PushFront(const T& value);
	// 头删
	void PopFront();
	// 查找
	Node<T>* Find(const T& value);
	// 插入
	void Insert( Node<T>* pos, const T&value);
	// 删除
	void Erase(Node<T>* pos);
	// 首元素
	T& Front();
	const T& Front()const;
	// 尾元素
	T& Back();
	const T& Back()const;
	// 判空
	bool Empty()const;
	// 元素个数
	size_t Size()const;
	// 输出运算符重载
	template<typename T>
	friend ostream& operator<<(ostream &_cout, const DoubleLinkList<T>&list);
};

    template<typename T>
    ostream& operator<<(ostream &_cout, const DoubleLinkList<T>&list);

#endif